import useSlideHandler from '@/hooks/useSlideHandler'
import { AWAIT_TIME } from '@/configs/env'
import { genDefaultSystemLayout } from '@/mocks/customElement/system'
import { genDefaultEquipLayout } from '@/mocks/customElement/equip'
import type { PPTImageElement, PPTTextElement, Slide } from '@/types/slides'
export default () => {
  const { createSlideByTemplate } = useSlideHandler()
  const handleDefaultImage = (slide: Slide) => {
    if (!slide.elements) return
    for (const element of slide.elements) {
      if (
        (element as PPTImageElement).replaceSrc &&
        element.type === 'image' &&
        element.src
      ) {
        element.src = element.replaceSrc!
        element.replaceSrc = undefined
      }
    }
  }

  /**
   * 根据系统&方法数据生成页面
   * 主要用于自定义字段来替换掉模板中的字段
   * 例如：模板中的某个数据为'今天是周{{week}}'，则传入replaceMap为[['week', '五']],则生成的数据为'今天是周五'
   * 注意：需要自己到 mocks 中创建自己定义字段的数据,图片不需要转 base64，url 即可
   */
  const createSystemFunctionSlide = (
    replaceMap: Map<string, string>,
    fixedKeyArr: string[],
    funcNum?: number,
  ) => {
    const slide = genDefaultSystemLayout(fixedKeyArr, funcNum, replaceMap)
    // 给系统描述添加ai生成描述
    ;(
      slide.elements.find(
        (item) => item.type === 'text' && Object.hasOwn(item, 'aiValue'),
      ) as PPTTextElement
    ).aiValue = replaceMap.get('aiValue')

    // 给系统方法描述添加ai描述
    let layoutsString = JSON.stringify(slide)
    for (const [key, value] of replaceMap) {
      const reg = new RegExp(`{{${key}}}`, 'g')
      layoutsString = layoutsString.replace(reg, value)
    }
    const layout = JSON.parse(layoutsString)
    // 处理默认图片
    handleDefaultImage(layout)
    // 根据模板数据生成页面
    createSlideByTemplate(layout)
  }

  /**
   * 根据设备清单生成页面
   */
  const createEquipmentSlide = (
    replaceMap: Map<string, string>,
    fixedKeyArr: string[],
  ) => {
    const slide = genDefaultEquipLayout(fixedKeyArr)

    let layoutsString = JSON.stringify(slide)
    for (const [key, value] of replaceMap) {
      const reg = new RegExp(`{{${key}}}`, 'g')
      layoutsString = layoutsString.replace(reg, value)
    }

    const layout = JSON.parse(layoutsString)

    // 处理默认图片
    handleDefaultImage(layout)
    // 根据模板数据生成页面
    createSlideByTemplate(layout)
  }

  /**
   * 按照页码插入页面
   * 主要用于业务上需要在某个位置插入自定义数据页面
   */
  const insertSlideByIndex = async (
    jsonPPtx: Slide,
    options: {
      /** 需要替换的map数据 */
      replaceMap: Map<string, string>
      /** 插入的索引 */
      index: number
      /** 是否替换掉默认图片，针对图片替换字段改成替换src字段 */
      replaceDefaultImg?: boolean
      remark?: string
    },
  ) => {
    if (!jsonPPtx) return
    const { replaceDefaultImg, replaceMap, index } = options
    if (!replaceMap) return jsonPPtx

    const cSlide = { ...jsonPPtx }
    let layoutsString = JSON.stringify(cSlide)

    for (const [key, value] of replaceMap) {
      const reg = new RegExp(`{{${key}}}`, 'g')
      let safeValue

      if (typeof value === 'string') {
        // const processedValue = value
        // .replace(/<p([^>]*)>/g, (match, attrs) => `<p${attrs.replace(/"/g, "'")}>`) // 把 p 标签里的双
        // .replace(/"/g, "'")
        // .replace(/<p style=''>/g, '<p>')
        // .replace(/<p style="">/g, '<p>')
        // .replace(/^<p>/, '') // 去掉开头的 <p>
        // .replace(/<\/p>$/, '') // 去掉结尾的 </p>
        // .replace(/<\/p>\s*<p>/g, '<br />') // 把 </p><p> 替换成换行
        // .replace(/\n/g, '<br>') // 替换换行符为 <br />

        // 处理两个中文引号的问题
        safeValue = JSON.stringify(value).slice(1, -1)
      }
      else {
        safeValue = JSON.stringify(value) // 其他类型（数字、布尔值、对象等）直接转换
      }
      layoutsString = layoutsString.replace(reg, safeValue)
    }

    const slide = JSON.parse(layoutsString)
    replaceDefaultImg && handleDefaultImage(slide)
    options.remark && Object.assign(slide, { remark: options.remark })
    createSlideByTemplate(slide, index)
    await new Promise((resolve) => setTimeout(resolve, AWAIT_TIME))
  }

  return {
    createSystemFunctionSlide,
    createEquipmentSlide,
    insertSlideByIndex,
  }
}
